Technical Q&A

NW 61 - DHCP オプションへのアクセス(1999 年 4 月 19 日)


Q: いま開発中のクロスプラットフォーム接続製品で、DHCP 設定の追加オプションをもとに自動設定を行う機能を実装させようと思っています。これらの追加オプションへは、Open Transport の TCP/IP スタック設定に使われる DHCP パケットからアクセスすることができるでしょうか?

A: Open Transport 2.0.1 よりも前のバージョンでは、TCP/IP スタックの設定に利用する DCHP パケットへアクセスする方法はありませんでした。Open Transport 2.0.1 では OTInetGetDHCPConfigInfo という新しい API ルーチンが登場したことにより、TCP/IP スタックの設定に利用する DHCPACK パケットのすべてのオプションにアクセスすることができます。この Q&A では、その新ルーチンについて解説しましょう

注意
この新ルーチンを使うには、Open Transport 2.0.1 SDK (以降) SDK のインタフェースとライブラリが必要です。


ハInetDHCPOption

struct InetDHCPOption
{
    UInt8       fOptionTag;
    UInt8       fOptionLen;
    UInt8       fOptionValue;
};
typedef struct InetDHCPOption InetDHCPOption;

このストラクチャは DHCP オプションに関する情報を返すのに利用されるもので、各フィールドには次のような意味があります。

fOptionTag
これは RFC 2132 DHCP Options and BOOTP Vendor Extensions で規定される DHCP タグオクテット (タグ付きデータ) を表します。
fOptionLen
これはオプションの全長を表しますが、タグオクテットのサイズ、および全長のバイト数は含まれません。
fOptionValue
このフィールドには、オプションを構成する不定のバイト配列を格納します。

ハOTInetGetDHCPConfigInfo

extern pascal OSStatus OTInetGetDHCPConfigInfo(InetDHCPOption* buf,
                    UInt32 bufSize, SInt32 index, SInt32 opt);

buf

OT の DHCP オプション格納するバッファへのポインタです。

bufSize

上のバッファのサイズです。

index

ここで指定したインタフェースの DHCP 設定から、オプションを抽出することができます。OTInetGetInterfaceInfo を呼び出す際のインタフェース指定に利用するインデックスと同じものです。デフォルトのインタフェースからオプションを取得したい場合は、kDefaultInetInterface を指定してください。

opt

DHCP 設定から抽出するオプションのタグオクテットを指定するか、kAllDHCPOptions と記述して全オプションを受け取ります。全オプションを要求した場合、オプションはDHCP 設定の内部に格納しているのと同じ形で圧縮されます。

result

エラー結果です。一般的なエラーには、kENOENTErr (TCP/IP が読み込まれていない、または index で指定したインタフェースが見つからないか、読み込まれなかった)、kEINVALErr (index には kDefaultInetInterface が指定されているのに、デフォルトのインタフェースが設定されていないか、特定のインタフェースが DHCP または BOOTP から設定されていない)、kENORSRCErr (TCP/IP スタックの読み込み時に保存用のメモリが不足していたため、DHCP 情報が利用できない)、kOTBufferOverflowErr (下記参照)、またはkOTBadOptionErr (opt で指定したオプションが DHCP 設定の中にない) が含まれます。

このルーチンは、buf と bufSize で記述したバッファ領域で、index で指定したインタフェースの DHCP オプション (タグオクテットを opt で指定したもの) の値を返します。index に kDefaultInetInterface を指定すると、デフォルトインタフェースのオプションを取得することができます。opt に kAllDHCPOptions を指定すると、そのインタフェースの DHCP オプションをすべて得ることができます。

opt に指定する標準的な値は、RFC 1700 「Assigned Numbers」で規定されています。これらオプションの戻り値の書式は、RFC 2132 「DHCP Options and BOOTP Vendor Extensions」で規定されています。

 

重要:
オプションの値は、DHCPACK パケット内に現れたものが返されるため、オプション値のコンポーネントフィールドが予想どおりの形で圧縮されていない可能性があります。オプション値を翻訳処理する前に、RFC をチェックしてください。

このルーチンでは、オプションの値は buf と bufSize で指定したバッファに収まる必要があります。バッファが小さすぎてオプション値を保持できない場合は、kOTBufferOverflowErr が返されます。全オプションを要求したときにこのエラーが返された場合は、バッファには bufSize で指定した最初の数バイト分のオプション値が含まれます。特定のオプションを要求したときにこのエラーが返された場合は、バッファには有効なデータが含まれていません。

次のサンプルコードでは、コンピュータの設定に利用した DHCP パケットから、サブネットマスクのオプションを抽出する方法を示しています。

enum {
    kDHCPSubnetMaskOption = 1
};
ハ
UInt8 optionBuffer[6];
ハ
err = OTInetGetDHCPConfigInfo(  (InetDHCPOption*) optionBuffer,
                                sizeof(optionBuffer),
                                kDefaultInetInterface,
                                kDHCPSubnetMaskOption);
if (err == noErr) {
    OTAssert("Got back wrong option", optionBuffer[0] == kDHCPSubnetMaskOption);
    OTAssert("Option size is wrong ", optionBuffer[1] == sizeof(InetHost));
    printf("Subnet mask provided by DHCP is %d.%d.%d.%d¥n",
                optionBuffer[2],
                optionBuffer[3],
                optionBuffer[4],
                optionBuffer[5]
            );
}


-- Quinn "The Eskimo!"
Worldwide Developer Technical Support

Technical Q&As | Contents
Previous Question | Next Question

To contact us, please use the Contact Us page.